package com.example;

/**
 * Created by Administrator on 2017/5/14.
 */

public class CurrentLineInfo {
    /**
     * 获取调用该方法处的文件名、类名，方法名以及行数
     */
    private static int originStackIndex = 2;

    public static String getFileName() {
        /**
         * 还可以采用另一种方式 new Throwable().getStackTrace().getStackTrace()[1]
         * 注意这里的参数是 1
         * 这是因为通过自定义的静态方法调用 Thread.currentThread().getStackTrace() 获取当前函数栈时, 已多加了两层方法调用.
         * 比如说在 Main.main() 方法中获取当前行号时, 其调用链为:
         * Main.main() --> CurrentLineInfo.getLineNumber() --> Thread.getStackStrace()
         * 因为栈是 先入后出 (队列是 先入先出), 所以最初调用位置的函数栈下表是 2.
         */
        return Thread.currentThread().getStackTrace()[originStackIndex].getFileName();
    }

    public static String getClassName() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getClassName();
    }

    public static String getMethodName() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getMethodName();
    }

    public static int getLineNumber() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getLineNumber();
    }

    public static void test(int line){
        System.out.println("getLineNumber() = " + getLineNumber());
        System.out.println("line = " + line);
    }
}
